package tech.aistar.util.mytoken;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 JwtBuilder builder = Jwts.builder() //这里其实就是new一个JwtBuilder，设置jwt的body
 .setClaims(claims)          //如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
 .setId(id)                  //设置jti(JWT ID)：是JWT的唯一标识，根据业务需要，这个可以设置为一个不重复的值，主要用来作为一次性token,从而回避重放攻击。
 .setIssuedAt(now)           //iat: jwt的签发时间
 .setSubject(subject)//sub(Subject)：代表这个JWT的主体，即它的所有人，这个是一个json格式的字符串，可以存放什么userid，roldid之类的，作为什么用户的唯一标志。
 .signWith(signatureAlgorithm, key);//设置签名使用的签名算法和签名使用的秘钥
 */
public class WxToken {

//    生成Token
    public static String  createToken(String uid) {
        long now = System.currentTimeMillis();//当前时间
        long exp = now + 1000*60*5;
         JwtBuilder builder= Jwts.builder().setId(UUID.randomUUID().toString().substring(0,9)) .setSubject(uid)
            .setIssuedAt(new Date())//设置签发时间
            .signWith(SignatureAlgorithm.HS256,"*JUST10*Bill*20")
                 .setExpiration(new Date(exp));//设置过期时间;//设置签名秘钥
         String token= builder.compact();
         return  token;
}
    public static String wxcheckToken( String token) {
        try {
            Claims claims = Jwts.parser().setSigningKey("*JUST10*Bill*20").parseClaimsJws(token).getBody();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy‐MM‐dd hh:mm:ss");
            return claims.getSubject();
        } catch (io.jsonwebtoken.ExpiredJwtException e) {
            return TokenEnum.ExpiredError;
        } catch (Exception e) {
            return TokenEnum.singerError;
        }

    }



}
